package exemple15.boiteoutils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import sun.misc.BASE64Encoder;

/**
 * <b>Classe Hachage :</b> cette classe permet de g�n�rer un hash MD5 ou SHA1 d'une cha�ne de
 * caract�re. Cette classe ne comprant que des m�thodes dites static. Il n'est pas donc pas n�cessaire
 * d'instancier un objet de cette classe pour utiliser ces fonctionnalit�s.
 * <br><br>
 * @author BRISSONNET Anthony
 * @version 0.01
 */
public class Hachage 
{

	/**
	 * Fonction permet de g�n�rer un Hash MD5 d'une cha�ne de caract�re pass� en param�tre.
	 * Il s'agit d'une fonction static, ne n�cessite donc pas la construction d'un objet. 
	 * @param texteClair
	 * @return Retourne la chaine hash� dans en MD5
	 */
	public static String MD5(final String texteClair) 
	{
		return hash("MD5", texteClair);
	}
	
	/**
	 * Fonction permet de g�n�rer un Hash SHA1 d'une cha�ne de caract�re pass� en param�tre.
	 * Il s'agit d'une fonction static, ne n�cessite donc pas la construction d'un objet. 
	 * @param texteClair
	 * @return Retourne la chaine hash� dans en SHA1
	 */
	public static String SHA1(final String texteClair) 
	{
		return hash("SHA1", texteClair);
	}
	
	/**
	 * Fonction permettant de g�n�rer le hachage d'une cha�ne de caract�re. Les fonctions 
	 * d�crites pr�c�demente utilise celle-ci. Si au hachage la cha�ne est encod� dans le format
	 * RAW (format par d�fault) puis est encod� en base 64.
	 * Il s'agit d'une fonction static, ne n�cessite donc pas la construction d'un objet.
	 * @param algorythme
	 * @param texteClair 
	 * @return <b>String</b> correspondant � la cha�ne hach� ou null si la fonction demand� n'est pas 
	 * le SHA1 ou le MD5.
	 */
	private static String hash(final String algorythme, final String texteClair)
	{
		/* D�finition des variables */
		BASE64Encoder encodeur = null;
		byte [] hash = null;
		MessageDigest fonctionDeHachage = null;
	
		/* Choix de la fonction de hachage */
		if (algorythme.equals("MD5") || algorythme.equals("SHA1"))
		{
			try
			{
				/* Chargement de la fonction de hachage */
				fonctionDeHachage = MessageDigest.getInstance(algorythme);
				
				/* On applique la fonction de hachage sur le mot de passe en clair */
				hash = fonctionDeHachage.digest(texteClair.getBytes());
				
				/* On encode en base64 */
				encodeur = new BASE64Encoder();
				return encodeur.encode(hash);
			}
			
			catch (NoSuchAlgorithmException e)
			{
				/* On renvoie un String null */
				return null;
			}
		}
		
		/* On renvoie un String null */
		return null;
	}
}
